`
https://leetcode.cn/problems/minimum-swaps-to-group-all-1s-together-ii/
`

/**
 * @param {number[]} nums
 * @return {number}
 */
var minSwaps = function (nums) {
  const n = nums.length
  // 1 的个数
  const k = nums.reduce((acc, cur) => acc + cur)
  if (k === 0 || k === n) return 0

  // 题目变为求环形数组 nums 中的长为 k 的子数组中的 0 的个数的最小值

  let left = 0, right = 0
  let count = 0
  let res = Infinity

  // 维护一个长度为 k 的滑动窗口
  // 题目要求为环形数组，>= n 的部分可以用 % 映射回去
  while (right < n + k - 1) {
    const n1 = nums[right < n ? right : right % n]
    if (n1 === 0) count++
    right++

    if (right - left >= k) {
      res = Math.min(res, count)
      const n2 = nums[left < n ? left : left % n]
      if (n2 === 0) count--
      left++
    }
  }

  return res
};